/**
 * 角色控制器
 * 负责处理角色相关的HTTP请求
 * 包括角色的创建、更新、删除、查询以及角色菜单分配等功能
 */
import RoleService from "../services/role.service.js";
import { validationResult } from "express-validator";
import logger from "../utils/logger.js";

class RoleController {
  /**
   * 创建角色
   * @param {Object} req - Express请求对象
   * @param {Object} res - Express响应对象
   * @param {Function} next - Express下一个中间件函数
   */
  static async createRole(req, res, next) {
    try {
      // 验证请求数据
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.fail(errors.array()[0].msg, 400);
      }

      // 获取请求体中的角色数据
      const roleData = req.body;
      
      // 调用服务创建角色
      const role = await RoleService.createRole(roleData);

      // 返回成功响应
      return res.success(role, '创建角色成功');
    } catch (error) {
      // 记录错误日志
      logger.error(`控制器创建角色失败: ${error.message}`);

      // 根据错误类型返回不同的响应
      if (error.message.includes('已存在')) {
        return res.fail(error.message, 400);
      }

      // 将其他错误传递给全局错误处理中间件
      next(error);
    }
  }

  /**
   * 更新角色
   * @param {Object} req - Express请求对象
   * @param {Object} res - Express响应对象
   * @param {Function} next - Express下一个中间件函数
   */
  static async updateRole(req, res, next) {
    try {
      // 验证请求数据
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.fail(errors.array()[0].msg, 400);
      }

      // 获取角色ID和更新数据
      const { id } = req.params;
      const roleData = req.body;

      // 验证是否有要更新的数据
      if (Object.keys(roleData).length === 0) {
        return res.fail('未提供要更新的数据');
      }

      // 调用服务更新角色
      const updatedRole = await RoleService.updateRole(parseInt(id), roleData);

      // 返回成功响应
      return res.success(updatedRole, '更新角色成功');
    } catch (error) {
      // 记录错误日志
      logger.error(`控制器更新角色失败: ${error.message}`);

      // 根据错误类型返回不同的响应
      if (error.message.includes("请求错误")) {
				return res.notFound(error.message);
			}

      if (error.message.includes('已存在')) {
        return res.fail(error.message, 400);
      }

      // 将其他错误传递给全局错误处理中间件
      next(error);
    }
  }

  /**
   * 删除角色
   * @param {Object} req - Express请求对象
   * @param {Object} res - Express响应对象
   * @param {Function} next - Express下一个中间件函数
   */
  static async deleteRole(req, res, next) {
    try {
      // 验证请求数据
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.fail(errors.array()[0].msg, 400);
      }

      // 获取角色ID
      const { id } = req.params;

      // 调用服务删除角色
      await RoleService.deleteRole(parseInt(id));

      // 返回成功响应
      return res.success(null, '删除角色成功');
    } catch (error) {
      // 记录错误日志
      logger.error(`控制器删除角色失败: ${error.message}`);

      // 根据错误类型返回不同的响应
      if (error.message.includes("请求错误")) {
				return res.notFound(error.message);
			}

      // 将其他错误传递给全局错误处理中间件
      next(error);
    }
  }

  /**
   * 获取角色列表
   * @param {Object} req - Express请求对象
   * @param {Object} res - Express响应对象
   * @param {Function} next - Express下一个中间件函数
   */
  static async getRoleList(req, res, next) {
    try {
      // 验证请求数据
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.fail(errors.array()[0].msg, 400);
      }

      const { page = 1, limit = 10, name, code, status } = req.query;
      
      const options = {
        page: parseInt(page),
        limit: parseInt(limit),
        name,
        code,
        status: status ? parseInt(status) : undefined
      };
      
      // 调用服务获取角色列表
      const result = await RoleService.getRoleList(options);
      
      // 返回成功响应
      return res.success(result, '获取角色列表成功');
    } catch (error) {
      // 记录错误日志
      logger.error(`控制器获取角色列表失败: ${error.message}`);

      // 将错误传递给全局错误处理中间件
      next(error);
    }
  }

  /**
   * 获取角色详情
   * @param {Object} req - Express请求对象
   * @param {Object} res - Express响应对象
   * @param {Function} next - Express下一个中间件函数
   */
  static async getRoleDetail(req, res, next) {
    try {
      // 验证请求数据
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.fail(errors.array()[0].msg, 400);
      }

      // 获取角色ID
      const { id } = req.params;

      // 调用服务获取角色详情
      const roleDetail = await RoleService.getRoleDetail(parseInt(id));
      
      // 返回成功响应
      return res.success(roleDetail, '获取角色详情成功');
    } catch (error) {
      // 记录错误日志
      logger.error(`控制器获取角色详情失败: ${error.message}`);

      // 根据错误类型返回不同的响应
      if (error.message.includes('不存在')) {
        return res.notFound(error.message);
      }

      // 将错误传递给全局错误处理中间件
      next(error);
    }
  }

  /**
   * 为角色分配菜单
   * @param {Object} req - Express请求对象
   * @param {Object} res - Express响应对象
   * @param {Function} next - Express下一个中间件函数
   */
  static async assignRoleMenus(req, res, next) {
    try {
      // 验证请求数据
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.fail(errors.array()[0].msg, 400);
      }

      // 获取角色ID和菜单ID数组
      const { id } = req.params;
      const { menuIds } = req.body;
      
      // 调用服务分配菜单
      await RoleService.assignRoleMenus(parseInt(id), menuIds);
      
      // 返回成功响应
      return res.success(null, '角色菜单分配成功');
    } catch (error) {
      // 记录错误日志
      logger.error(`控制器角色菜单分配失败: ${error.message}`);

      // 根据错误类型返回不同的响应
      if (error.message.includes('请求错误')) {
        return res.notFound(error.message);
      }
      if (error.message.includes("参数错误")) {
				return res.fail(error.message, 400);
			}

      // 将错误传递给全局错误处理中间件
      next(error);
    }
  }

  /**
   * 获取角色菜单树
   * @param {Object} req - Express请求对象
   * @param {Object} res - Express响应对象
   * @param {Function} next - Express下一个中间件函数
   */
  static async getRoleMenuTree(req, res, next) {
    try {
      // 验证请求数据
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.fail(errors.array()[0].msg, 400);
      }

      // 获取角色ID
      const { id } = req.params;

      // 调用服务获取角色菜单树
      const menuTree = await RoleService.getRoleMenuTree(parseInt(id));
      
      // 返回成功响应
      return res.success(menuTree, '获取角色菜单树成功');
    } catch (error) {
      // 记录错误日志
      logger.error(`控制器获取角色菜单树失败: ${error.message}`);

      // 根据错误类型返回不同的响应
      if (error.message.includes('不存在')) {
        return res.notFound(error.message);
      }

      // 将错误传递给全局错误处理中间件
      next(error);
    }
  }
}

export default RoleController; 